package persistencia;

import clases.Usuario;
import clases.Invitacion;
import java.sql.*;
import controlador.*;
import Util.*;
import java.util.ArrayList;
import java.util.GregorianCalendar;
import java.util.Calendar;
import java.util.Collection;

import java.util.Date;
import java.util.Random;
import clases.Invitacion.*;

public class PersistenciaInvitaciones extends PersistenciaConexion {

    public static boolean darAltaInvitacion(String nick) {

        boolean res = false;
        Connection con = null;
        Statement st = null;
        int quedan = 0;

        //Habria que comprobar antes que aun le quedan invitaciones para poder dar de alta 
        //nuevas invitaciones        
        try {
            crearConexion();
            quedan = invitacionesRestantes(nick);
            if (quedan > 0) {
                int rowcount = st.executeUpdate("UPDATE  invitaciones SET "
                        + "estado ="+ EstadoInv.ACEPTADA + "WHERE nickUsuario = " + nick);
                if (rowcount == 1) {
                    res = true;
                }
            }
        } catch (Exception e) {
            System.out.println("ERROR");

        } finally {
            PersistenciaConexion.cerrarConexion(con);
        }
        return res;
    }

    /*
    public static boolean darBajaInvitacion(String codigo) {

        boolean res = false;
        Connection con = null;
        Statement st = null;

        try {
            crearConexion();
            int rowcount = st.executeUpdate("UPDATE invitaciones SET "
                    + "estado ="+ EstadoInv.BAJA + "WHERE codigo = " + codigo);
            if (rowcount == 1) {
                res = true;
            }
        } catch (Exception e) {
            System.out.println("ERROR");

        } finally {
            PersistenciaConexion.cerrarConexion(con);
        }
        return res;
    }
    */
    
    // Para borrar una invitacion le paso el nick del asuario receptor ->usuarioAcepta
    // asi, borramos esa invitacion de la bd.
    //¿? tengo que considerar la fechaAceptacion este vacio o el estado a baja
    public static void borraInvitacion(String nick) {

        Connection con = null;
        Statement st = null;

        try {
            crearConexion();

            int rowcount = st.executeUpdate("DELETE FROM invitaciones WHERE usuarioAcepta ='" + nick + "'");

        } catch (Exception e) {
            System.out.println("ERROR");

        } finally {
            PersistenciaConexion.cerrarConexion(con);
        }
    }

    public static void aceptarInvitacion(String codigoInv, String nickReceptor) {

        Connection con = null;
        Statement st = null;
        Invitacion inv = new Invitacion();
        Usuario miUsu = new Usuario();
        //Para recuperar la fecha del sistema
         // Calcular fecha caducidad
        long lAhora = System.currentTimeMillis();
        java.util.Date d = new Date(lAhora);
        
        try {
            crearConexion();
            if(codigoInv == null && nickReceptor == null)
                throw new IllegalArgumentException();
            
            if((inv.getCodigo().equalsIgnoreCase(codigoInv)) && (!miUsu.getUsuario().equalsIgnoreCase(nickReceptor)))
            {                
                int rowcount = st.executeUpdate("UPDATE invitaciones"
                        + "SET fechaAceptacion = '" + UtilFecha.fechaMySQL(d)+ "',"
                        + " estado = " + EstadoInv.ACEPTADA + "WHERE usuarioAcepta = " + nickReceptor);
            }
        } catch (Exception e) {
            System.out.println("ERROR");

        } finally {
            PersistenciaConexion.cerrarConexion(con);
        }
    }

  
        public static void aceptarInvitacion3(String nickUsuAcepta, String emailAcepta) {
                    long lAhora = System.currentTimeMillis();
                    //" + EstadoInv.ACEPTADA + "
                    //fechaAceptacion = '" + UtilFecha.fechaMySQL(d)+ "',
        java.util.Date d = new Date(lAhora);
        String sql = "UPDATE invitaciones"
                        + " SET fechaAceptacion = '" + UtilFecha.fechaMySQL(d)+ "',usuarioAcepta='"+nickUsuAcepta+"',"
                        + " estado ='" + EstadoInv.ACEPTADA + "' WHERE usuarioAceptaEmail='"+emailAcepta+"'";

        Connection con = null;
        Statement st = null;
        try {
            con = PersistenciaConexion.crearConexion();
            st = con.createStatement();
            st.executeUpdate(sql);
            st.close();

        } catch (Exception e) {
            System.out.println("Error al actualizar el estado del usuario. " + e.getMessage());
        }
        PersistenciaConexion.cerrarConexion(con);
    }
    
    
    public static int invitacionesRestantes(String usuarioEnvia) {

        Connection con = null;
        Statement st = null;
        int cont = 0;
        int total = 0;


        try {
            crearConexion();
            //Cuenta las invitaciones enviadas por un usuario, habria que restarselas al total que puede enviar
            ResultSet invitacionesRestantes = st.executeQuery("SELECT COUNT (*) AS contador FROM invitaciones "
                    + " WHERE usuarioEnvia=" + usuarioEnvia);
            cont = invitacionesRestantes.getInt("contador");
            cont = total - cont;

        } catch (Exception e) {
            System.out.println("ERROR");

        } finally {
            PersistenciaConexion.cerrarConexion(con);
        }
        return cont;//return restantes;
    }

    public static int invitacionesAceptadas(String usuarioAcepta, String usuarioEnvia) {

        Connection con = null;
        Statement st = null;
        int cont = 0;

        try {
            crearConexion();

            ResultSet aceptadas = st.executeQuery("SELECT COUNT (*) AS contador FROM invitaciones "
                    + " WHERE usuarioAcepta=" + usuarioAcepta + "AND usuarioEnvia=" + usuarioEnvia);
            cont = aceptadas.getInt("contador");

        } catch (Exception e) {
            System.out.println("ERROR");

        } finally {
            PersistenciaConexion.cerrarConexion(con);
        }
        return cont;
    }

    public static void invitacionesUsuario(String usuarioEnvia) {

        Connection con = null;
        Statement st = null;

        try {
            crearConexion();
            ResultSet rs = st.executeQuery("SELECT (*) FROM invitaciones WHERE usuarioEnvia=" + usuarioEnvia);
        } catch (Exception e) {

            System.out.println("ERROR");
        } finally {
            PersistenciaConexion.cerrarConexion(con);
        }
    }

    //10/junio/2011
    // Vamos a registrar una invitacion.    
    public static void registrarUnaInvitacion(Usuario usu, String dos, Invitacion inv) {
        String sql = "insert into invitaciones(codigo, fechaEnvio, fechaAceptacion,"
                + " usuarioEnvia, usuarioAcepta, estado)"
                + " values ('" + inv.getCodigo() + "','"
                + UtilFecha.fechaMySQL(inv.getFechaEnvio()) + "','"
                + UtilFecha.fechaMySQL(inv.getFechaAceptacion()) + "',"
                + usu.getUsuario() + "','"
                + "usuarioAcepta" + "','"
                + EstadoInv.ENVIADA + "');";
        Connection con = null;
        Statement st = null;

        try {
            con = PersistenciaConexion.crearConexion();
            st = con.createStatement();
            st.executeUpdate(sql);
            st.close();
            System.out.println("[i] La invitacion se ha dado de alta correctamente.");
        } catch (Exception e) {
            System.out.println("[!] Error al insertar una nuevo invitacion. " + e.getMessage());
        }

        PersistenciaConexion.cerrarConexion(con);

    }

    public static void eliminarInvitacionesCaducadas() {
        Connection con = null;
        Statement st = null;
        ResultSet rs = null;

        // Calcular fecha caducidad
        long lAhora = System.currentTimeMillis();
        java.util.Date d = new Date(lAhora);

        Calendar cal = new GregorianCalendar();
        cal.setTime(d);
        cal.add(Calendar.MONTH, -1); //TODO MIGUEL Añadir la constante de la clase Invitacion

        d = cal.getTime();

        try {
            con = PersistenciaConexion.crearConexion();
            st = con.createStatement();
            crearConexion();
            st.executeUpdate("delete from invitaciones where invitaciones.fechaEnvio < '" + UtilFecha.fechaMySQL(d) + "'");
            st.close();
            rs.close();
        } catch (Exception e) {
            System.out.println("ERROR");
        } finally {
            PersistenciaConexion.cerrarConexion(con);
        }
    }

    public static void registraInvitacion(Usuario usu, Invitacion inv) {
        String sql = "insert into invitaciones(codigo, fechaEnvio,"
                + " usuarioEnvia, estado, usuarioAceptaEmail)"
                + " values ('" + inv.getCodigo() + "','"
                + UtilFecha.fechaMySQL(inv.getFechaEnvio()) + "','"
                + usu.getUsuario() + "','" + EstadoInv.ENVIADA + "','" + inv.getUsuarioReceptorEmail() + "');";
        Connection con = null;
        Statement st = null;

        try {
            con = PersistenciaConexion.crearConexion();
            st = con.createStatement();
            st.executeUpdate(sql);
            st.close();
            System.out.println("[i] La invitacion se ha dado de alta correctamente.");
        } catch (Exception e) {
            System.out.println("[!] Error al insertar una nuevo invitacion. " + e.getMessage());
        }

        PersistenciaConexion.cerrarConexion(con);

    }

    
    public static Collection<Invitacion> obtenerInvitacionesUsuario(String usuario) {
        Connection con = null;
        Statement st = null;
        ResultSet rs = null;

        Collection<Invitacion> invitaciones = new ArrayList();
        Invitacion invitacion;

        try {
            con = PersistenciaConexion.crearConexion();
            st = con.createStatement();
            crearConexion();
            rs = st.executeQuery("SELECT * FROM invitaciones WHERE usuarioEnvia = '" + usuario + "'");
            while (rs.next()) {
                invitacion = new Invitacion(PersistenciaUsuario.cargaUsuario(rs.getString("usuarioEnvia")), rs.getString("usuarioAceptaEmail"));
                invitaciones.add(invitacion);
            }

            st.close();
            rs.close();
        } catch (Exception e) {
            System.out.println("ERROR");
        } finally {
            PersistenciaConexion.cerrarConexion(con);
            return invitaciones;
        }
    }
    
    public static Collection<Invitacion> obtenerInvitacionesUsuario2(String usuario) {
        Connection con = null;
        Statement st = null;
        ResultSet rs = null;
        Usuario usu = PersistenciaUsuario.cargaUsuario(usuario);
        Collection<Invitacion> invitaciones = new ArrayList();
        Invitacion invitacion;

        try {
            con = PersistenciaConexion.crearConexion();
            st = con.createStatement();

            rs = st.executeQuery("SELECT * FROM invitaciones WHERE usuarioEnvia = '" + usuario + "'");
            while (rs.next()) {
                invitacion = new Invitacion(PersistenciaUsuario.cargaUsuario(rs.getString("usuarioEnvia")),PersistenciaUsuario.cargaUsuario(rs.getString("usuarioAcepta")),UtilFecha.obtenerFechaBD(rs.getString("fechaEnvio")),UtilFecha.obtenerFechaBD(rs.getString("fechaAceptacion")));
                invitaciones.add(invitacion);
            }
            
            st.close();
            rs.close();
        } catch (Exception e) {
            System.out.println("ERROR");
        } finally {
            PersistenciaConexion.cerrarConexion(con);
            return invitaciones;
        }
    }
    
    
    public static boolean existeInvitacion(String usuEmail) {
        boolean existe = false;
        String sql = "select idInvitacion from invitaciones where usuarioAceptaEmail='"+usuEmail+"' and estado='enviada'";

        Connection con = null;
        Statement st = null;
        ResultSet rs = null;

        try {
            con = PersistenciaConexion.crearConexion();
            st = con.createStatement();
            rs = st.executeQuery(sql);

            if (rs.next()) {
                existe = true;
            }
        } catch (Exception e) {
            System.out.println("[!] Error al comprobar si existe el usuario. " + e.getMessage());
        }
        PersistenciaConexion.cerrarConexion(con);
        return existe;
    }
    
        public static boolean existeChorizo(String url) {
        boolean existe = false;
        String sql = "select idInvitacion from invitaciones where codigo='"+url+"'";

        Connection con = null;
        Statement st = null;
        ResultSet rs = null;

        try {
            con = PersistenciaConexion.crearConexion();
            st = con.createStatement();
            rs = st.executeQuery(sql);

            if (rs.next()) {
                existe = true;
            }
        } catch (Exception e) {
            System.out.println("[!] Error al comprobar si existe el usuario. " + e.getMessage());
        }
        PersistenciaConexion.cerrarConexion(con);
        return existe;
    }
    
}
